package cn.niit.pm.interceptor;
import cn.niit.pm.entity.Employee;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
 *   是否登录的拦截器  主要拦截用户是否登录
 */
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
    //在controller方法之前执行  应用场景：可以用于身份验正、身份授权等
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行preHandle++++++++++++++++");
        /**
         * 第一步：想要拦截 先获取用户URL地址
         * **/
        String uri = request.getRequestURI(); //  获取uri  uri= /user/user
        String url = request.getRequestURL().toString(); //获取url   url=http://localhost:8080/user/user
        /**
         * 第二步：获取URL后 判断该请求是否需要拦截
         * * **/
        Employee employee = (Employee) request.getSession().getAttribute("employee"); //通过request拿到session对象  最后拿到user对象
        if (null==employee){
            System.out.println("拦截器LoginInterceptor执行了preHandle方法 将【" + url + "】已拦截，拦截原因：用户未登录");
            response.sendRedirect("/login");
            return false;
        }
        return true;
    }


    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //应用场景：将公用的模型数据（比如菜单导航之类的）在这里传到视图，也可以在这里统一指定视图
        //postHandle方法:在controller执行完之后 在DispatcherServlet进行视图的渲染之前（即返回ModelAndView之前）执行
        System.out.println("执行postHandle--------------");//打印日志  查看此方法是否执行
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //应用场景：统一异常处理  统一日志处理  销毁资源
        // afterCompletion方法：视图渲染之后执行  即这个时候用户已经看到了整个页面 且页面不可更改
        System.out.println("执行了afterCompletion****************");//打印日志  查看此方法是否执行
    }
}

